﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Globalization;

namespace InnvoiceActual.Logica.GestorObject.Remito
{
    public class PieRemito : INotifyPropertyChanged, IDataErrorInfo
    {
        #region Event

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Property

        EmpresaCS empresa = EmpresaCS.Instance;

        private int _codigoEmpresa;
        public int CodigoEmpresa
        {
            get
            {
                return _codigoEmpresa;
            }
            set
            {
                _codigoEmpresa = value;
            }
        }

        private int _nroComprobante1;
        public int NroComprobante1
        {
            get
            {
                return _nroComprobante1;
            }
            set
            {
                _nroComprobante1 = value;
            }
        }

        private int _nroComprobante2;
        public int NroComprobante2
        {
            get
            {
                return _nroComprobante2;
            }
            set
            {
                _nroComprobante2 = value;
            }
        }

        private byte _codigoTipo;
        public byte CodigoTipo
        {
            get
            {
                return _codigoTipo;
            }
            set
            {
                _codigoTipo = value;
            }
        }

        public decimal _subTotal;
        public decimal SubTotal
        {
            get
            {
                return _subTotal;
            }
            set
            {
                _subTotal = value;
            }
        }

        private double _bonificacion;
        public double Bonificacion
        {
            get
            {
                return _bonificacion;
            }
            set
            {
                if (_bonificacion == value)
                    return;
                _bonificacion = value;
            }
        }

        private string _transporte;
        public string Transporte
        {
            get
            {
                return _transporte;
            }
            set
            {
                if (this._transporte == value)
                {
                    return;
                }
                this._transporte = value;
            }
        }

        private string _viajante;
        public string Viajante
        {
            get
            {
                return _viajante;
            }
            set
            {
                if (this._viajante == value)
                {
                    return;
                }
                this._viajante = value;
            }
        }

        private int _bulto;
        public int Bulto
        {
            get
            {
                return _bulto;
            }
            set
            {
                if (_bulto == value)
                    return;
                _bulto = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Bulto"));
            }
        }

        public double _pesoKilogramo;
        public double PesoKilogramo
        {
            get
            {
                return _pesoKilogramo;
            }
            set
            {
                if (_pesoKilogramo == value)
                    return;
                _pesoKilogramo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("PesoKilogramo"));
            }
        }

        private decimal _total;
        public decimal Total
        {
            get
            {
                return _total;
            }
            set
            {
                if (_total == value)
                    return;
                _total = value;
            }
        }

        public string Error
        {
            get
            {
                return null;
            }
        }

        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }

        #endregion

        #region Contructor

        public PieRemito()
        {
            _codigoEmpresa = empresa.CodigoEmpresa;
            _nroComprobante1 = empresa.NroComprabante1;
            _transporte = "Transporte";
            _viajante = "Viajante";
            _bulto = 1;
            _pesoKilogramo = 0;
            _total = 0.0m;
        }

        #endregion

        #region Methods

        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "Bulto":
                    //if (Bulto == 0 || Bulto.Equals(null))
                    //{
                    //    return "El campo Bulto es requerido";
                    //}
                    //else
                    //{
                        Regex regExBulto;
                        regExBulto = new Regex(@"[0-9]{1,9}");
                        if (!regExBulto.IsMatch(Bulto.ToString("D", CultureInfo.InvariantCulture)))
                            return "El campo Bulto no " +
                                "tiene un formato correcto, debe usar solo numeros, " +
                                "sin decimales";
                    //}
                    break;
                case "PesoKilogramo":
                    Regex regExPesoKg;
                    regExPesoKg = new Regex(@"[0-9]{1,9}(\.[0-9]{0,2})?$");
                    if (!regExPesoKg.IsMatch(PesoKilogramo.ToString("F2", CultureInfo.InvariantCulture)))
                            return "El campo PesoKilogramo no " +
                                "tiene un formato correcto, debe usar . " +
                                "para delimitar los decimales";
                    break;
            }
            return null;
        }

        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("Bulto")) 
                && string.IsNullOrEmpty(IsValid("PesoKilogramo"));
        }

        #endregion
    }

    public class MyOrderingPieRemito : IComparer<PieRemito>
    {
        public int Compare(PieRemito x, PieRemito y)
        {
            int compareDate = x.NroComprobante2.CompareTo(y.NroComprobante2);
            return compareDate;
        }
    }
}
